package com.woniuxy.controller;

import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.woniuxy.entity.User;
import com.woniuxy.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;

/**
 * @Author: 马宇航
 * @Todo: TODO
 * @DateTime: 25/03/04/星期二 11:44
 * @Component: 成都蜗牛学苑
 **/
@RestController
@RequestMapping("/user/")
@CrossOrigin
public class UserController {
    @Autowired
    StringRedisTemplate redisTemplate;
    @Autowired
    UserService userService;

    @GetMapping("/{startPage}/{pageSize}")
    public SaResult logout(@PathVariable Integer startPage,
                           @PathVariable Integer pageSize) {
        IPage<User> page = new Page<>(startPage, pageSize);
        IPage<User> page1 = userService.page(page,new QueryWrapper<User>().orderByDesc("id"));
        return SaResult.data(page1);
    }

    @PostMapping("")
    public SaResult add(@RequestBody User user) {
        String password = user.getPassword();
        String newPassword = SaSecureUtil.md5BySalt(password, user.getUsername());
        user.setPassword(newPassword);
        if(user.getId() == null){
            //新增
            userService.save(user);
        }else {
            //更新
            userService.updateById(user);
        }
        return SaResult.ok();
    }
    @DeleteMapping("{id}")
    public SaResult delete(@PathVariable Integer id) {
        userService.removeById(id);
        return SaResult.ok();
    }
    // 测试登录，浏览器访问： http://localhost:8081/user/doLogin?username=zhang&password=123456
    @RequestMapping("doLogin")
    public SaResult doLogin(String username, String password) {
        User user = userService.getOne(username);
        //user判空
        if(user == null) {
            return SaResult.error("用户不存在");
        }
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对
        if(user.getUsername().equals(username) && user.getPassword().equals(SaSecureUtil.md5BySalt(password,username))) {
            StpUtil.login(user.getId());
            //登录成功后，要把token这些信息发给前端
            return SaResult.data(StpUtil.getTokenInfo());
        }
        return SaResult.error();
    }

    // 查询登录状态，浏览器访问： http://localhost:8081/user/isLogin
    @RequestMapping("isLogin")
    public String isLogin() {
        return "当前会话是否登录：" + StpUtil.isLogin();
    }
    // 查询 Token 信息  ---- http://localhost:8081/acc/tokenInfo
    @RequestMapping("tokenInfo")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }

    // 测试注销  ---- http://localhost:8081/acc/logout
    @RequestMapping("logout")
    public SaResult logout() {
        StpUtil.logout();
        return SaResult.ok();
    }
    /*
        @ModelAttribute  解决一个动态sql问题
        1. 作用：
            1. 自动将请求参数封装到指定的对象中  params -> 对象
            2. 自动将指定的对象添加到模型中
        2. 位置：
            1. 方法的形参上
            2. 方法的返回值上
        3. 特点：
            1. 自动将请求参数封装到
     */
    //ip:port/user/1/10  startPage=1 pageSize=10
    @PostMapping ("{startpage}/{pageSize}")
    //@PathVariable括号里面的值，可以不用写，前提是上面的内容和这里的内容一致
    public SaResult logout(@PathVariable("startpage") Integer startPage,
                           @PathVariable Integer pageSize,
                           @RequestBody User user) {
        IPage<User> page = new Page<>(startPage, pageSize);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(user);
        IPage<User> page1 = userService.page(page, queryWrapper);
        return SaResult.data(page1);
    }

}
